<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    一,递归函数(不算是一种函数的种类,只是一种应用方式)
    <script>
        // function fn(){
        //     fn()
        // }
        // fn()
    </script>
    递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时，递归前进；当边界条件满足时，递归返回。用递归需要注意以下两点：

    1. 递归就是在过程或函数里调用自身。
    2. 在使用递归策略时，必须有一个明确的递归结束条件，称为递归出口。

    递:传递条件
    归:结束条件,递归出口

    n!阶乘
    1.求阶乘
    5!=5*4*3*2*1  =>5*!4
    4!=4*3*2*1 =>4*!3
    3!=3*2*1 =>3*!2
    2!=2*1  =>2*!1
    1!=1 递归出口
    n!=n*(n-1);
    <script>
       function fn(n){
        if(n===1){
            return 1
        }
        return n*fn(n-1);
        // 2*fn(1)=>2*1
        // 3*fn(2)=>3*2 =>2*1
       }
       console.log(fn(5));//120
       //Uncaught RangeError: Maximum call stack size exceeded 超过了最大调用堆栈的大小

    </script>

    递归的缺点:很少写,运行效率低,可能出现死循环.
</body>
</html>